package edu.northwestern.cbits.purple_robot_manager.tests;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import junit.framework.Assert;
import org.json.JSONException;
import org.json.JSONObject;
import org.mozilla.javascript.NativeJavaObject;
import android.content.Context;
import edu.northwestern.cbits.purple_robot_manager.R;
import edu.northwestern.cbits.purple_robot_manager.scripting.BaseScriptEngine;
import edu.northwestern.cbits.purple_robot_manager.triggers.DateTrigger;
import edu.northwestern.cbits.purple_robot_manager.triggers.Trigger;
import edu.northwestern.cbits.purple_robot_manager.triggers.TriggerManager;
public class RepeatingTriggerTestCase extends RobotTestCase
{
public RepeatingTriggerTestCase(Context context, int priority)
{
super(context, priority);
}
public void test()
{
if (this.isSelected(this._context) == false)
return;
TriggerManager triggers = TriggerManager.getInstance(this._context);
this.broadcastUpdate("Clearing triggers...");
triggers.removeAllTriggers();
Assert.assertEquals("RDT0", 0, triggers.allTriggers().size());
// TODO: Tests for these script calls elsewhere...
BaseScriptEngine.runScript(this._context, "PurpleRobot.persistString('repeat-test-token', '');");
NativeJavaObject persisted = (NativeJavaObject) BaseScriptEngine.runScript(this._context,
"PurpleRobot.fetchString('repeat-test-token');");
Assert.assertEquals("RDT1", "", persisted.unwrap()); // TODO: Unwrap at
// scripting
// engine?
String triggerId = "repeat-date-test";
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
long now = System.currentTimeMillis() + 60000;
try
{
JSONObject triggerDef = new JSONObject();
triggerDef.put("type", "datetime");
triggerDef.put(Trigger.NAME, "Repeating Date Test");
triggerDef.put(Trigger.IDENTIFIER, triggerId);
triggerDef
.put(Trigger.ACTION,
"PurpleRobot.playDefaultTone(); PurpleRobot.testLog('Date Test: Repeat Fired!'); PurpleRobot.persistString('repeat-test-token', PurpleRobot.fetchString('repeat-test-token') + 'a'); PurpleRobot.vibrate('SOS');");
triggerDef.put(DateTrigger.DATETIME_START, sdf.format(new Date(now)));
triggerDef.put(DateTrigger.DATETIME_REPEATS, "FREQ=MINUTELY;INTERVAL=2");
String script = "PurpleRobot.updateTrigger('" + triggerId + "', "
+ triggerDef.toString().replace("'", "\\'").replace("\"", "'") + ");";
BaseScriptEngine.runScript(this._context, script);
this.broadcastUpdate("Created repeating trigger.");
Thread.sleep(2000);
}
catch (JSONException e)
{
Assert.fail("RDT2");
}
catch (InterruptedException e)
{
Assert.fail("RDT3");
}
this.broadcastUpdate("Verifying repeating trigger exists...");
List<Trigger> allTriggers = triggers.allTriggers();
Assert.assertEquals("RDT4", 1, allTriggers.size());
Trigger trigger = allTriggers.get(0);
Assert.assertEquals("RDT5", triggerId, trigger.identifier());
Assert.assertEquals("RDT6", trigger.getClass(), DateTrigger.class);
DateTrigger dateTrigger = (DateTrigger) trigger;
List<Long> upcomingTimes = triggers.upcomingFireTimes(this._context);
Assert.assertTrue("RDT7", upcomingTimes.size() > 0);
Assert.assertTrue("RDT8", dateTrigger.matches(this._context, new Date(now + (2 * 60 * 1000) + 15000)));
try
{
long wait = (10 * 60 * 1000);
while (wait > 0)
{
this.broadcastUpdate("Sleeping. " + (wait / (60 * 1000)) + " minutes remaining...", 0);
Thread.sleep(60 * 1000);
wait = wait - (60 * 1000);
}
}
catch (InterruptedException e)
{
Assert.fail();
}
this.broadcastUpdate("Verifying that repeating trigger fired...");
Assert.assertTrue("RDT9", dateTrigger.lastFireTime(this._context) > 0);
Assert.assertTrue("RDTA", dateTrigger.lastFireTime(this._context) < System.currentTimeMillis());
this.broadcastUpdate("Checking trigger results...");
persisted = (NativeJavaObject) BaseScriptEngine.runScript(this._context,
"PurpleRobot.fetchString('repeat-test-token');");
Assert.assertEquals("RDTB", "aaaaa", persisted.unwrap());
this.broadcastUpdate("Clearing triggers...");
triggers.removeAllTriggers();
}
public int estimatedMinutes()
{
return 11;
}
public String name(Context context)
{
return context.getString(R.string.name_repeating_date_trigger_test);
}
}